
import { http } from '@/utils/http/axios';
import {axios} from 'axios'

/**
 * 请求参数封装为 FormData 对象
 * @param params 参数
 * @returns {FormData}
 */
const packageFormData = (params) => {
  const data = new FormData();
  Object.keys(params).forEach(function(key) {
    data.append(key, params[key]);
  });
  return data;
}

/**
 * 上传文件
 * @param options 配置参数
 * @param options.url 上传接口地址
 * @param options.params 请求参数
 * @param options.file File文件对象
 * @param options.onUploadProgress 上传进度事件
 * @param options.filename File文件键名，默认 file
 * @returns {Promise}
 */
export const uploadFile = (options) => {
  const params = options.params || {};  // 没有参数默认为空JSON对象
  params[options.filename || 'file'] = options.file;  // 没有规定file键名，默认为file
  const axiosOptions = {
    url: options.url,
    method: 'post',
    params: packageFormData(params)
  };
  axiosOptions.params.set('sectionNum',options.sectionNum)
  axiosOptions.params.set('sectionTotal',options.sectionTotal);
  axiosOptions.params.set('chunkid',options.chunkid);
  axiosOptions.params.set('basicName',options.basicName);
  axiosOptions.params.set('rawName',options.rawName);
  // 判断是否需要上传进度反馈事件
  if (options.onUploadProgress) axiosOptions.onUploadProgress = options.onUploadProgress;
  return http.request(axiosOptions);
}

/**
 * 切片上传
 * @param options 配置参数
 * @param options.url 上传接口地址
 * @param options.params 请求参数
 * @param options.file File文件对象
 * @param options.onUploadProgress 上传进度事件
 * @param options.filename File文件键名，默认 file
 * @returns {Promise<[]>}
 */
export async function uploadSection (options) {
  const sectionSize = 1 * 1024 * 1024 * 10; // 切片大小，超过该值将进行切片上传，字节(b)单位
  const sectionTotal = Math.ceil(options.file.size / sectionSize);  // 切片次数
  const fileSize = options.file.size; // 文件大小
  const results = []; // 切片结果返回集
  const chunkid=new Date().getTime();
  const basicName = options.filename;
  const rawName = options.file.name;
  for(let i = 0; i < sectionTotal; i++) {
    const startSize = i * sectionSize;  // 切片开始位置
    // 切片结尾位置，判断如果是最后一次直则是文件大小
    const endSize = i === sectionSize - 1 ? fileSize : (i + 1) * sectionSize;
    const new_options = {...options};  // 复制原有的 options
    new_options.file = options.file.slice(startSize, endSize);
    new_options.sectionTotal=sectionTotal;
    new_options.sectionNum=i;
    new_options.chunkid=chunkid;
    new_options.basicName=basicName;
    new_options.rawName = rawName;
    if (options.onUploadProgress) {
      new_options.onUploadProgress = (progressEvent) => {
        options.onUploadProgress({
          loaded: startSize + progressEvent.loaded,
          total: fileSize
        });
      };
    }
    results.push(await uploadFile(new_options));
  }
  
  return results[sectionTotal-1];
}

// 调用方法
// uploadSection({
// 	url: '上传地址',
// 	params: {},	// 请求携带的参数
// 	file: file,	// 上传的文件对象
// 	onUploadProgress: (event) => {
// 		console.log('已上传进度：', event.loaded, '总大小：', event.total)
// 	},
// 	filename: 'file',	// File文件键名
// })
